#!/bin/bash
# change_ssh_port_8300.sh
# 作用：将 SSH 端口改为 8300，并让 22 不再监听（不修改防火墙）
# 兼容：Debian / Ubuntu
# 用法：bash <(curl -fsSL https://你的原始链接/raw/change_ssh_port_8300.sh)

usage() {
    echo "用法：bash <(curl -fsSL https://你的原始链接/raw/change_ssh_port_8300.sh)"
    echo "注意：必须以 root 权限运行"
    exit 1
}

# 检查 root 权限
if [ "$(id -u)" -ne 0 ]; then
    echo "必须以 root 权限运行" >&2
    usage
fi

CFG_MAIN="/etc/ssh/sshd_config"
CFG_DIR="/etc/ssh/sshd_config.d"
NEW_PORT=8300

# 备份原始配置文件
cp "$CFG_MAIN" "$CFG_MAIN.bak" || { echo "备份配置文件失败" >&2; exit 1; }

# 删除主配置中的所有 Port 行
sed -i '/^[[:space:]]*Port[[:space:]]\+/d' "$CFG_MAIN"
printf '\nPort 8300\n' >> "$CFG_MAIN"

# 处理配置片段目录
if [ -d "$CFG_DIR" ]; then
    find "$CFG_DIR" -type f -name "*.conf" -exec sed -i 's/^[[:space:]]*Port/# &/g' {} \;
fi

# 检查配置语法
/usr/sbin/sshd -t || { echo "配置文件语法错误" >&2; exit 1; }

# 重启 SSH 服务
if systemctl is-active --quiet ssh; then
    systemctl restart ssh
elif systemctl is-active --quiet sshd; then
    systemctl restart sshd
else
    echo "无法检测到 SSH 服务，手动重启" >&2
fi

# 检查监听端口
if command -v ss > /dev/null 2>&1; then
    ss -tuln | grep -E "\b:$NEW_PORT\b"
elif command -v netstat > /dev/null 2>&1; then
    netstat -tuln | grep -E "\b:$NEW_PORT\b"
else
    echo "无法检测监听端口，请手动检查" >&2
fi

echo ""
echo "✅ 已切换为 $NEW_PORT。请用以下命令连接："
echo "ssh 用户名@服务器IP -p $NEW_PORT"